package org.feng.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.feng.entity.Tuple2;
import org.feng.service.MathStreamService;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 数学计算-流式API练习-功能实现
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2022年06月09日 23时25分
 */
@Slf4j
public class MathStreamServiceImpl implements MathStreamService {
    /**
     * 打印输出一个数字序列中的所有【奇数和】 和 【偶数和】
     *
     * @param ints 整数序列
     * @return 输出到控制台，返回为空
     */
    @Override
    public Mono<Void> printOddAndEven(List<Integer> ints) {

        Flux.fromIterable(ints).groupBy(num -> (num % 2 == 0) ? "偶数" : "奇数")
                .flatMap(groupedFlux -> groupedFlux.reduce(Integer::sum).map(num -> new Tuple2<>(groupedFlux.key(), num)))
                .subscribe(
                        tuple -> log.info("计算得到{}和：{}", tuple.t1, tuple.t2)
                );
        return null;
    }

    public static void main(String[] args) {
        // 准备一个序列
        List<Integer> ints = IntStream.rangeClosed(1, 5).boxed().collect(Collectors.toList());
        new MathStreamServiceImpl().printOddAndEven(ints);
    }
}